
package com.yixiu.modules.sys.controller;



import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import com.yixiu.common.entity.R;
import com.yixiu.modules.shiro.ShiroUtils;
import com.yixiu.modules.sys.dao.SysMenuDao;
import com.yixiu.modules.sys.entity.SysMenuEntity;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;

/**
 * 登录相关
 *
 * 测试如下：
 * 访问   http://localhost:8080/captcha.jpg     获取到验证码
 * 访问   http://localhost:8080/sys/login?username=admin&password=admin&captcha=    登录，注意修改验证码
 * 访问   http://localhost:8080/sys/testlogin   测试登录，获取可以查看的菜单
 * 访问   http://localhost:8080/logout  退出
 * 再次访问 testlogin页面，就会跳转到登录页面。 http://localhost:8080/login.html
 */
// 使用RestController，可以直接返回json
@RestController
public class TestSysLoginController {

	@Autowired
	private Producer producer;



	@Autowired
	private SysMenuDao sysMenuDao;

    /**
     * 生成验证码
     * 注意：要写一个验证码配置类KaptchaConfig，注入到容器中。Producer 只是一个接口。
     *
     * @param response
     * @throws IOException
     */
	@RequestMapping("captcha.jpg")
	public void captcha(HttpServletResponse response)throws IOException {
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");

        //生成文字验证码
        String text = producer.createText();
        //生成图片验证码
        BufferedImage image = producer.createImage(text);
        //保存到shiro session
        ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
        
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpg", out);
	}
	
	/**
	 * 登录
	 */
	// @ResponseBody  注释掉后直接返回json
	@RequestMapping(value = "/sys/login", method = RequestMethod.GET)  // 修改为get方法，方便测试
	public R login(String username, String password, String captcha) {

		// 下面的代码是验证验证码，去掉后，不验证
//		String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
//		if(!captcha.equalsIgnoreCase(kaptcha)){
//			return R.error("验证码不正确");
//		}
		
		try{
			Subject subject = ShiroUtils.getSubject();
			UsernamePasswordToken token = new UsernamePasswordToken(username, password);
			subject.login(token);
		}catch (UnknownAccountException e) {
			return R.error(e.getMessage());
		}catch (IncorrectCredentialsException e) {
			return R.error("账号或密码不正确");
		}catch (LockedAccountException e) {
			return R.error("账号已被锁定,请联系管理员");
		}catch (AuthenticationException e) {
			return R.error("账户验证失败");
		}
	    
		return R.ok();
	}


	/**
	 * 退出
	 */
	@RequestMapping(value = "logout", method = RequestMethod.GET)
	public String logout() {
		ShiroUtils.logout();
		return "redirect:login.html";
	}

	// @ResponseBody  注释掉后直接返回json
	@RequestMapping(value = "/sys/testlogin", method = RequestMethod.GET)
	@RequiresPermissions("sys:menu:list")   // 查看菜单列表的权限
	public List<SysMenuEntity> testLogin() {
		QueryWrapper<SysMenuEntity> queryWrapper = new QueryWrapper();
		// 设置查询条件
		queryWrapper.eq("parent_id",1L); //
		List<SysMenuEntity> list = sysMenuDao.selectList(queryWrapper);
		return  list;
	}


	
}
